package dp.子数组;

/**
 * @author songZiHao
 * @version 1.0.0
 * @ClassName 比特位计数338.java
 * @Description https://leetcode-cn.com/problems/counting-bits/
 * @createTime 2021年11月20日 11:47:00
 *
 * 给你一个整数 n ，对于 0 <= i <= n 中的每个 i ，计算其二进制表示中 1 的个数 ，返回一个长度为 n + 1 的数组 ans 作为答案。
 */
public class 比特位计数338 {
	public static int[] countBits(int n) {
		//定义备忘录：dp[i] 表示数值为i的数的二进制表示中1 的数量
		int[] dp=new int[n+1];
		//初始化
		dp[0]=0;
		/**
		 *0(0) 1(1) 2(10) 3(11) 4(100) 5(101) 6(110) 7(111) 8(1000) 9(1001) 10(1010)
		 *
		 * 状态转移方程
		 * 	  二进制表示中，奇数一定比前面那个偶数多一个 1，因为多的就是最低位的 1
		 * 	  二进制表示中，偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0，除以 2 就是右移一位，也就是把那个 0 抹掉而已，所以 1 的个数是不变的
		 *
		 * 判断是不是2的立方的方法，i%2==1
		 */
		for (int i = 1; i <= n; i++) {
			if (i%2==1){
				dp[i]=dp[i-1]+1;
			}else {
				dp[i]=dp[i/2];
			}
		}
		return dp;
	}

}